﻿/*  
 *  Copyright © 2014 Matthew David Elgert - mdelgert@yahoo.com
 *
 *  GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
 *  
 *  Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
 *
 *  Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
 *
 *  The GNU General Public License is a free, copyleft license for software and other kinds of works.
 *  
 *  The licenses for most software and other practical works are designed to take away your freedom to share and change the works. 
 *  By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a 
 *  program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public 
 *  License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your 
 *  programs, too.
 * 
 * When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure 
 * that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code 
 * or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you 
 * can do these things.
 * 
 * To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, 
 * you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the 
 * freedom of others.
 * 
 * For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same 
 * freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these 
 * terms so they know their rights.
 * 
 * Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this 
 * License giving you legal permission to copy, distribute and/or modify it.
 * 
 * For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both 
 * users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be 
 * attributed erroneously to authors of previous versions.
 * 
 * Some devices are designed to deny users access to install or run modified versions of the software inside them, although the 
 * manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The 
 * systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most 
 * unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems 
 * arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as 
 * needed to protect the freedom of users.
 * 
 * Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and 
 * use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a 
 * free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the 
 * program non-free.
 * 
 *  Project URL: https://monosharp.codeplex.com
 *  License URL: https://monosharp.codeplex.com/license 
 *  
 */

namespace Base.ConsoleApplicationExample1
{

    using System;
    using System.Threading;
    using System.Diagnostics;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    class Program
    {
        static void Main(string[] args)
        {


            LaunchCommandLineApp();
            //LaunchSsh();
            Console.ReadKey();

        }



        static void LaunchSsh()
        {

            //http://stackoverflow.com/questions/285760/how-to-spawn-a-process-and-capture-its-stdout-in-net
            System.Diagnostics.Process process = new System.Diagnostics.Process();

            //Windows
            //process.StartInfo.FileName = "cmd";
            
            //Linux
            process.StartInfo.FileName = "bash";
            //process.StartInfo.FileName = "sh";

            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            
            //process.OutputDataReceived += (sender, args) => Console.WriteLine("received output: {0}", args.Data);

            process.OutputDataReceived += (sender, args) => Console.WriteLine("shell output: {0}", args.Data);
            
            //Console.WriteLine("C:\\");
            
            process.Start();
            process.BeginOutputReadLine();

            process.WaitForExit();

            Console.ReadKey();

        }

        /// <summary>
        /// Launch the legacy application with some options set.
        /// </summary>
        static void LaunchCommandLineApp()
        {

            //Example link: - http://stackoverflow.com/questions/4291912/process-start-how-to-get-the-output
            //http://mono.1490590.n4.nabble.com/excute-linux-command-under-mono-C-td1533563.html
            //http://ubuntuforums.org/showthread.php?t=320322
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "echo";
            proc.StartInfo.Arguments = " 'Everything starts with a hello world linux! Mono allows C# to run on linux.'";
            proc.Start();
            proc.WaitForExit();

        }

        static void LoopGPIO()
        {
            for (int i = 1; i <= 500; i++)
            {


                ////http://stackoverflow.com/questions/18262025/executed-piped-commands-via-system-diagnostics-process-on-mono
                //var proc1 = new ProcessStartInfo { FileName = "/bin/bash", Arguments = "-c -n '1' > /sys/class/gpio/gpio3/value" };
                //proc.StartInfo = proc1;

                System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.EnableRaisingEvents = false;

                proc.StartInfo.FileName = "echo";
                proc.StartInfo.Arguments = " -n '1' > /sys/class/gpio/gpio3/value";
                proc.Start();
                proc.WaitForExit();

                Thread.Sleep(5000);

                proc.StartInfo.Arguments = " -n '0' > /sys/class/gpio/gpio3/value";
                proc.Start();
                proc.WaitForExit();



            }

        }

    }

}
